/**
 *                                                        ____   _____
 *  Dynarch Calendar -- JSCal2, version 1.8               \  /_  /   /
 *  Built at 2010/04/11 12:26 GMT                          \  / /   /
 *                                                          \/ /_  /
 *  (c) Dynarch.com 2009                                     \  / /
 *  All rights reserved.                                       / /
 *  Visit www.dynarch.com/projects/calendar for details        \/
 *
 */
Calendar = (function () {
    function y(at) {
        at = at || {};
        this.args = at = al(at, {animation:!c, cont:null, bottomBar:true, date:true, fdow:aq("fdow"), min:null, max:null, reverseWheel:false, selection:[], selectionType:y.SEL_SINGLE, weekNumbers:false, align:"Bl/ / /T/r", inputField:null, trigger:null, dateFormat:"%Y-%m-%d", opacity:j ? 1 : 3, titleFormat:"%b %Y", showTime:false, timePos:"right", time:true, minuteStep:5, disabled:ad, checkRange:false, dateInfo:ad, onChange:ad, onSelect:ad, onTimeChange:ad, onFocus:ad, onBlur:ad});
        this.handlers = {};
        var P = this, D = new Date();
        at.min = Y(at.min);
        at.max = Y(at.max);
        if (at.date === true) {
            at.date = D
        }
        if (at.time === true) {
            at.time = D.getHours() * 100 + Math.floor(D.getMinutes() / at.minuteStep) * at.minuteStep
        }
        this.date = Y(at.date);
        this.time = at.time;
        this.fdow = at.fdow;
        m("onChange onSelect onTimeChange onFocus onBlur".split(/\s+/), function (av) {
            var au = at[av];
            if (!(au instanceof Array)) {
                au = [au]
            }
            P.handlers[av] = au
        });
        this.selection = new y.Selection(at.selection, at.selectionType, R, this);
        var ar = K.call(this);
        if (at.cont) {
            W(at.cont).appendChild(ar)
        }
        if (at.trigger) {
            this.manageFields(at.trigger, at.inputField, at.dateFormat)
        }
    }

    var S = navigator.userAgent, s = /opera/i.test(S), ai = /Konqueror|Safari|KHTML/i.test(S), j = /msie/i.test(S) && !s && !(/mac_powerpc/i.test(S)), c = j && /msie 6/i.test(S), x = /gecko/i.test(S) && !ai && !s && !j, l = y.prototype, q = y.I18N = {};
    y.SEL_NONE = 0;
    y.SEL_SINGLE = 1;
    y.SEL_MULTIPLE = 2;
    y.SEL_WEEK = 3;
    y.dateToInt = V;
    y.intToDate = B;
    y.printDate = ab;
    y.formatString = k;
    y.i18n = aq;
    y.LANG = function (P, D, ar) {
        q.__ = q[P] = {name:D, data:ar}
    };
    y.setup = function (D) {
        return new y(D)
    };
    l.moveTo = function (aG, aD) {
        aG = Y(aG);
        var aC = af(aG, this.date, true), au, az = this.args, aH = az.min && af(aG, az.min), aI = az.max && af(aG, az.max);
        if (az.showTime) {
            this.setHours(aG.getHours());
            this.setMinutes(aG.getMinutes())
        }
        if (!az.animation) {
            aD = false
        }
        ae(aH != null && aH <= 1, [this.els.navPrevMonth, this.els.navPrevYear], "DynarchCalendar-navDisabled");
        ae(aI != null && aI >= -1, [this.els.navNextMonth, this.els.navNextYear], "DynarchCalendar-navDisabled");
        if (aH < -1) {
            aG = az.min;
            au = 1;
            aC = 0
        }
        if (aI > 1) {
            aG = az.max;
            au = 2;
            aC = 0
        }
        this.date = aG;
        this.refresh(!!aD);
        this.callHooks("onChange", this, aG, aD);
        if (aD && !(aC == 0 && aD == 2)) {
            if (this._bodyAnim) {
                this._bodyAnim.stop()
            }
            var aw = this.els.body, ax = G("div", "DynarchCalendar-animBody-" + U[aC], aw), aF = aw.firstChild, av = am(aF) || 0.7, ay = au ? Z.brakes : aC == 0 ? Z.shake : Z.accel_ab2, aE = aC * aC > 4, ar = aE ? aF.offsetTop : aF.offsetLeft, aB = ax.style, aA = aE ? aw.offsetHeight : aw.offsetWidth;
            if (aC < 0) {
                aA += ar
            } else {
                if (aC > 0) {
                    aA = ar - aA
                } else {
                    aA = Math.round(aA / 7);
                    if (au == 2) {
                        aA = -aA
                    }
                }
            }
            if (!au && aC != 0) {
                var P = ax.cloneNode(true), D = P.style, at = 2 * aA;
                P.appendChild(aF.cloneNode(true));
                D[aE ? "marginTop" : "marginLeft"] = aA + "px";
                aw.appendChild(P)
            }
            aF.style.visibility = "hidden";
            ax.innerHTML = ac(this);
            this._bodyAnim = ap({onUpdate:v(function (aK, aM) {
                var aL = ay(aK);
                if (P) {
                    var aJ = aM(aL, aA, at) + "px"
                }
                if (au) {
                    aB[aE ? "marginTop" : "marginLeft"] = aM(aL, aA, 0) + "px"
                } else {
                    if (aE || aC == 0) {
                        aB.marginTop = aM(aC == 0 ? ay(aK * aK) : aL, 0, aA) + "px";
                        if (aC != 0) {
                            D.marginTop = aJ
                        }
                    }
                    if (!aE || aC == 0) {
                        aB.marginLeft = aM(aL, 0, aA) + "px";
                        if (aC != 0) {
                            D.marginLeft = aJ
                        }
                    }
                }
                if (this.args.opacity > 2 && P) {
                    am(P, 1 - aL);
                    am(ax, aL)
                }
            }, this), onStop:v(function (aJ) {
                aw.innerHTML = ac(this, aG);
                this._bodyAnim = null
            }, this)})
        }
        this._lastHoverDate = null;
        return aH >= -1 && aI <= 1
    };
    l.isDisabled = function (D) {
        var P = this.args;
        return(P.min && af(D, P.min) < 0) || (P.max && af(D, P.max) > 0) || P.disabled(D)
    };
    l.toggleMenu = function () {
        u(this, !this._menuVisible)
    };
    l.refresh = function (D) {
        var P = this.els;
        if (!D) {
            P.body.innerHTML = ac(this)
        }
        P.title.innerHTML = F(this);
        P.yearInput.value = this.date.getFullYear()
    };
    l.redraw = function () {
        var D = this.els;
        this.refresh();
        D.dayNames.innerHTML = h(this);
        D.menu.innerHTML = ak(this);
        if (D.bottomBar) {
            D.bottomBar.innerHTML = H(this)
        }
        t(D.topCont, v(function (ar) {
            var P = r[ar.className];
            if (P) {
                D[P] = ar
            }
            if (ar.className == "DynarchCalendar-menu-year") {
                p(ar, this._focusEvents);
                D.yearInput = ar
            } else {
                if (j) {
                    ar.setAttribute("unselectable", "on")
                }
            }
        }, this));
        this.setTime(null, true)
    };
    l.setLanguage = function (D) {
        var P = y.setLanguage(D);
        if (P) {
            this.fdow = P.data.fdow;
            this.redraw()
        }
    };
    y.setLanguage = function (D) {
        var P = q[D];
        if (P) {
            q.__ = P
        }
        return P
    };
    l.focus = function () {
        try {
            this.els[this._menuVisible ? "yearInput" : "focusLink"].focus()
        } catch (D) {
        }
        i.call(this)
    };
    l.blur = function () {
        this.els.focusLink.blur();
        this.els.yearInput.blur();
        z.call(this)
    };
    l.showAt = function (P, ax, av, pos) {
        pos = pos || "absolute";
        if (this._showAnim) {
            this._showAnim.stop()
        }
        av = av && this.args.animation;
        var aw = this.els.topCont,
            ar = this,
            D = this.els.body.firstChild,
            au = D.offsetHeight,
            at = aw.style;
        at.position = pos;
        at.left = P + "px";
        at.top = ax + "px";
        at.zIndex = 10000;
        at.display = "";
        if (av) {
            D.style.marginTop = -au + "px";
            this.args.opacity > 1 && am(aw, 0);
            this._showAnim = ap({onUpdate:function (ay, az) {
                D.style.marginTop = -az(Z.accel_b(ay), au, 0) + "px";
                ar.args.opacity > 1 && am(aw, ay)
            }, onStop:function () {
                ar.args.opacity > 1 && am(aw, "");
                ar._showAnim = null
            }})
        }
    };
    l.hide = function () {
        var at = this.els.topCont, P = this, D = this.els.body.firstChild, ar = D.offsetHeight, au = J(at).y;
        if (this.args.animation) {
            if (this._showAnim) {
                this._showAnim.stop()
            }
            this._showAnim = ap({onUpdate:function (av, aw) {
                P.args.opacity > 1 && am(at, 1 - av);
                D.style.marginTop = -aw(Z.accel_b(av), 0, ar) + "px";
                at.style.top = aw(Z.accel_ab(av), au, au - 10) + "px"
            }, onStop:function () {
                at.style.display = "none";
                D.style.marginTop = "";
                P.args.opacity > 1 && am(at, "");
                P._showAnim = null
            }})
        } else {
            at.style.display = "none"
        }
        this.inputField = null
    };
    l.popup = function (D, at) {
        D = W(D);
        if (!at) {
            at = this.args.align
        }
        at = at.split(/\x2f/);
        var ar = J(D), aw = this.els.topCont, ay = aw.style, au, ax = X();
        ay.visibility = "hidden";
        ay.display = "";
        this.showAt(0, 0);
        document.body.appendChild(aw);
        au = {x:aw.offsetWidth, y:aw.offsetHeight};
        function P(az) {
            var aA = {x:av.x, y:av.y};
            if (!az) {
                return aA
            }
            if (/B/.test(az)) {
                aA.y += D.offsetHeight
            }
            if (/b/.test(az)) {
                aA.y += D.offsetHeight - au.y
            }
            if (/T/.test(az)) {
                aA.y -= au.y
            }
            if (/l/.test(az)) {
                aA.x -= au.x - D.offsetWidth
            }
            if (/L/.test(az)) {
                aA.x -= au.x
            }
            if (/R/.test(az)) {
                aA.x += D.offsetWidth
            }
            if (/c/i.test(az)) {
                aA.x += (D.offsetWidth - au.x) / 2
            }
            if (/m/i.test(az)) {
                aA.y += (D.offsetHeight - au.y) / 2
            }
            return aA
        }

        var av = ar;
        av = P(at[0]);
        if (av.y < ax.y) {
            av.y = ar.y;
            av = P(at[1])
        }
        if (av.x + au.x > ax.x + ax.w) {
            av.x = ar.x;
            av = P(at[2])
        }
        if (av.y + au.y > ax.y + ax.h) {
            av.y = ar.y;
            av = P(at[3])
        }
        if (av.x < ax.x) {
            av.x = ar.x;
            av = P(at[4])
        }
        this.showAt(av.x, av.y, true);
        ay.visibility = "";
        this.focus()
    };
    l.manageFields = function (ar, P, D) {
        P = W(P);
        p(W(ar), "click", v(function () {
            this.inputField = P;
            this.dateFormat = D;
            if (this.selection.type == y.SEL_SINGLE) {
                var aw, av, au, at;
                aw = /input|textarea/i.test(P.tagName) ? P.value : (P.innerText || P.textContent);
                if (aw) {
                    av = /(^|[^%])%[bBmo]/.exec(D);
                    au = /(^|[^%])%[de]/.exec(D);
                    if (av && au) {
                        at = av.index < au.index
                    }
                    aw = Calendar.parseDate(aw, at);
                    if (aw) {
                        this.selection.set(aw, false, true);
                        this.moveTo(aw)
                    }
                }
            }
            this.popup(ar)
        }, this))
    };
    l.callHooks = function (ar) {
        var at = b(arguments, 1), D = this.handlers[ar], P = 0;
        for (; P < D.length; ++P) {
            D[P].apply(this, at)
        }
    };
    l.addEventListener = function (P, D) {
        this.handlers[P].push(D)
    };
    l.removeEventListener = function (at, ar) {
        var D = this.handlers[at], P = D.length;
        while (--P >= 0) {
            if (D[P] === ar) {
                D.splice(P, 1)
            }
        }
    };
    l.getTime = function () {
        return this.time
    };
    l.setTime = function (au, P) {
        if (this.args.showTime) {
            au = this.time = au != null ? au : this.time;
            var ar = this.getHours(), D = this.getMinutes(), at = ar < 12;
            if (this.args.showTime == 12) {
                if (ar == 0) {
                    ar = 12
                }
                if (ar > 12) {
                    ar -= 12
                }
                this.els.timeAM.innerHTML = aq(at ? "AM" : "PM")
            }
            if (ar < 10) {
                ar = "0" + ar
            }
            if (D < 10) {
                D = "0" + D
            }
            this.els.timeHour.innerHTML = ar;
            this.els.timeMinute.innerHTML = D;
            if (!P) {
                this.callHooks("onTimeChange", this, au)
            }
        }
    };
    l.getHours = function () {
        return Math.floor(this.time / 100)
    };
    l.getMinutes = function () {
        return this.time % 100
    };
    l.setHours = function (D) {
        if (D < 0) {
            D += 24
        }
        this.setTime(100 * (D % 24) + this.time % 100)
    };
    l.setMinutes = function (D) {
        if (D < 0) {
            D += 60
        }
        this.setTime(100 * this.getHours() + (D % 60))
    };
    l._getInputYear = function () {
        var D = parseInt(this.els.yearInput.value, 10);
        if (isNaN(D)) {
            D = this.date.getFullYear()
        }
        return D
    };
    l._showTooltip = function (D) {
        var P = "", at, ar = this.els.tooltip;
        if (D) {
            D = B(D);
            at = this.args.dateInfo(D);
            if (at && at.tooltip) {
                P = "<div class='DynarchCalendar-tooltipCont'>" + ab(D, at.tooltip) + "</div>"
            }
        }
        ar.innerHTML = P
    };
    var ah = " align='center' cellspacing='0' cellpadding='0'";

    function h(D) {
        var ar = ["<table", ah, "><tr>"], P = 0;
        if (D.args.weekNumbers) {
            ar.push("<td><div class='DynarchCalendar-weekNumber'>", aq("wk"), "</div></td>")
        }
        while (P < 7) {
            var at = (P++ + D.fdow) % 7;
            ar.push("<td><div", aq("weekend").indexOf(at) >= 0 ? " class='DynarchCalendar-weekend'>" : ">", aq("sdn")[at], "</div></td>")
        }
        ar.push("</tr></table>");
        return ar.join("")
    }

    function ac(aw, aG, aD) {
        aG = aG || aw.date;
        aD = aD || aw.fdow;
        aG = new Date(aG.getFullYear(), aG.getMonth(), aG.getDate(), 12, 0, 0, 0);
        var aI = aG.getMonth(), av = [], aA = 0, D = aw.args.weekNumbers;
        aG.setDate(1);
        var az = (aG.getDay() - aD) % 7;
        if (az < 0) {
            az += 7
        }
        aG.setDate(-az);
        aG.setDate(aG.getDate() + 1);
        var aE = new Date(), at = aE.getDate(), P = aE.getMonth(), aJ = aE.getFullYear();
        av[aA++] = "<table class='DynarchCalendar-bodyTable'" + ah + ">";
        for (var aC = 0; aC < 6; ++aC) {
            av[aA++] = "<tr class='DynarchCalendar-week";
            if (aC == 0) {
                av[aA++] = " DynarchCalendar-first-row"
            }
            if (aC == 5) {
                av[aA++] = " DynarchCalendar-last-row"
            }
            av[aA++] = "'>";
            if (D) {
                av[aA++] = "<td class='DynarchCalendar-first-col'><div class='DynarchCalendar-weekNumber'>" + a(aG) + "</div></td>"
            }
            for (var aB = 0; aB < 7; ++aB) {
                var aF = aG.getDate(), ay = aG.getMonth(), au = aG.getFullYear(), ar = 10000 * au + 100 * (ay + 1) + aF, aH = aw.selection.isSelected(ar), ax = aw.isDisabled(aG);
                av[aA++] = "<td class='";
                if (aB == 0 && !D) {
                    av[aA++] = " DynarchCalendar-first-col"
                }
                if (aB == 0 && aC == 0) {
                    aw._firstDateVisible = ar
                }
                if (aB == 6) {
                    av[aA++] = " DynarchCalendar-last-col";
                    if (aC == 5) {
                        aw._lastDateVisible = ar
                    }
                }
                if (aH) {
                    av[aA++] = " DynarchCalendar-td-selected"
                }
                av[aA++] = "'><div dyc-type='date' unselectable='on' dyc-date='" + ar + "' ";
                if (ax) {
                    av[aA++] = "disabled='1' "
                }
                av[aA++] = "class='DynarchCalendar-day";
                if (aq("weekend").indexOf(aG.getDay()) >= 0) {
                    av[aA++] = " DynarchCalendar-weekend"
                }
                if (ay != aI) {
                    av[aA++] = " DynarchCalendar-day-othermonth"
                }
                if (aF == at && ay == P && au == aJ) {
                    av[aA++] = " DynarchCalendar-day-today"
                }
                if (ax) {
                    av[aA++] = " DynarchCalendar-day-disabled"
                }
                if (aH) {
                    av[aA++] = " DynarchCalendar-day-selected"
                }
                ax = aw.args.dateInfo(aG);
                if (ax && ax.klass) {
                    av[aA++] = " " + ax.klass
                }
                av[aA++] = "'>" + aF + "</div></td>";
                aG = new Date(au, ay, aF + 1, 12, 0, 0, 0)
            }
            av[aA++] = "</tr>"
        }
        av[aA++] = "</table>";
        return av.join("")
    }

    function n(D) {
        var P = ["<table class='DynarchCalendar-topCont'", ah, "><tr><td><div class='DynarchCalendar'>", !j ? "<button class='DynarchCalendar-focusLink'></button>" : "<a class='DynarchCalendar-focusLink' href='#'></a>", "<div class='DynarchCalendar-topBar'><div dyc-type='nav' dyc-btn='-Y' dyc-cls='hover-navBtn,pressed-navBtn' class='DynarchCalendar-navBtn DynarchCalendar-prevYear'><div></div></div><div dyc-type='nav' dyc-btn='+Y' dyc-cls='hover-navBtn,pressed-navBtn' class='DynarchCalendar-navBtn DynarchCalendar-nextYear'><div></div></div><div dyc-type='nav' dyc-btn='-M' dyc-cls='hover-navBtn,pressed-navBtn' class='DynarchCalendar-navBtn DynarchCalendar-prevMonth'><div></div></div><div dyc-type='nav' dyc-btn='+M' dyc-cls='hover-navBtn,pressed-navBtn' class='DynarchCalendar-navBtn DynarchCalendar-nextMonth'><div></div></div><table class='DynarchCalendar-titleCont'", ah, "><tr><td><div dyc-type='title' dyc-btn='menu' dyc-cls='hover-title,pressed-title' class='DynarchCalendar-title'>", F(D), "</div></td></tr></table><div class='DynarchCalendar-dayNames'>", h(D), "</div></div><div class='DynarchCalendar-body'></div>"];
        if (D.args.bottomBar || D.args.showTime) {
            P.push("<div class='DynarchCalendar-bottomBar'>", H(D), "</div>")
        }
        P.push("<div class='DynarchCalendar-menu' style='display: none'>", ak(D), "</div><div class='DynarchCalendar-tooltip'></div></div></td></tr></table>");
        return P.join("")
    }

    function F(D) {
        return"<div unselectable='on'>" + ab(D.date, D.args.titleFormat) + "</div>"
    }

    function ak(P) {
        var au = ["<table height='100%'", ah, "><tr><td><table style='margin-top: 1.5em'", ah, "><tr><td colspan='3'><input dyc-btn='year' class='DynarchCalendar-menu-year' size='6' value='", P.date.getFullYear(), "' /></td></tr><tr><td><div dyc-type='menubtn' dyc-cls='hover-navBtn,pressed-navBtn' dyc-btn='today'>", aq("goToday"), "</div></td></tr></table><p class='DynarchCalendar-menu-sep'>&nbsp;</p><table class='DynarchCalendar-menu-mtable'", ah, ">"], av = aq("smn"), at = 0, D = au.length, ar;
        while (at < 12) {
            au[D++] = "<tr>";
            for (ar = 4; --ar > 0;) {
                au[D++] = "<td><div dyc-type='menubtn' dyc-cls='hover-navBtn,pressed-navBtn' dyc-btn='m" + at + "' class='DynarchCalendar-menu-month'>" + av[at++] + "</div></td>"
            }
            au[D++] = "</tr>"
        }
        au[D++] = "</table></td></tr></table>";
        return au.join("")
    }

    function w(D, P) {
        P.push("<table class='DynarchCalendar-time'" + ah + "><tr><td rowspan='2'><div dyc-type='time-hour' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-hour'></div></td><td dyc-type='time-hour+' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-up'></td><td rowspan='2' class='DynarchCalendar-time-sep'></td><td rowspan='2'><div dyc-type='time-min' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-minute'></div></td><td dyc-type='time-min+' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-up'></td>");
        if (D.args.showTime == 12) {
            P.push("<td rowspan='2' class='DynarchCalendar-time-sep'></td><td rowspan='2'><div class='DynarchCalendar-time-am' dyc-type='time-am' dyc-cls='hover-time,pressed-time'></div></td>")
        }
        P.push("</tr><tr><td dyc-type='time-hour-' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-down'></td><td dyc-type='time-min-' dyc-cls='hover-time,pressed-time' class='DynarchCalendar-time-down'></td></tr></table>")
    }

    function H(D) {
        var ar = [], P = D.args;
        ar.push("<table", ah, " style='width:100%'><tr>");
        function at() {
            if (P.showTime) {
                ar.push("<td>");
                w(D, ar);
                ar.push("</td>")
            }
        }

        if (P.timePos == "left") {
            at()
        }
        if (P.bottomBar) {
            ar.push("<td>");
            ar.push("<table", ah, "><tr><td><div dyc-btn='today' dyc-cls='hover-bottomBar-today,pressed-bottomBar-today' dyc-type='bottomBar-today' class='DynarchCalendar-bottomBar-today'>", aq("today"), "</div></td></tr></table>");
            ar.push("</td>")
        }
        if (P.timePos == "right") {
            at()
        }
        ar.push("</tr></table>");
        return ar.join("")
    }

    var r = {"DynarchCalendar-topCont":"topCont", "DynarchCalendar-focusLink":"focusLink", DynarchCalendar:"main", "DynarchCalendar-topBar":"topBar", "DynarchCalendar-title":"title", "DynarchCalendar-dayNames":"dayNames", "DynarchCalendar-body":"body", "DynarchCalendar-menu":"menu", "DynarchCalendar-menu-year":"yearInput", "DynarchCalendar-bottomBar":"bottomBar", "DynarchCalendar-tooltip":"tooltip", "DynarchCalendar-time-hour":"timeHour", "DynarchCalendar-time-minute":"timeMinute", "DynarchCalendar-time-am":"timeAM", "DynarchCalendar-navBtn DynarchCalendar-prevYear":"navPrevYear", "DynarchCalendar-navBtn DynarchCalendar-nextYear":"navNextYear", "DynarchCalendar-navBtn DynarchCalendar-prevMonth":"navPrevMonth", "DynarchCalendar-navBtn DynarchCalendar-nextMonth":"navNextMonth"};

    function K() {
        var ar = G("div"), P = this.els = {}, D = {mousedown:v(I, this, true), mouseup:v(I, this, false), mouseover:v(T, this, true), mouseout:v(T, this, false), keypress:v(L, this)};
        D[x ? "DOMMouseScroll" : "mousewheel"] = v(E, this);
        if (j) {
            D.dblclick = D.mousedown;
            D.keydown = D.keypress
        }
        ar.innerHTML = n(this);
        t(ar.firstChild, function (au) {
            var at = r[au.className];
            if (at) {
                P[at] = au
            }
            if (j) {
                au.setAttribute("unselectable", "on")
            }
        });
        p(P.main, D);
        p([P.focusLink, P.yearInput], this._focusEvents = {focus:v(i, this), blur:v(e, this)});
        this.moveTo(this.date, false);
        this.setTime(null, true);
        return P.topCont
    }

    function i() {
        if (this._bluringTimeout) {
            clearTimeout(this._bluringTimeout)
        }
        this.focused = true;
        M(this.els.main, "DynarchCalendar-focused");
        this.callHooks("onFocus", this)
    }

    function z() {
        this.focused = false;
        aj(this.els.main, "DynarchCalendar-focused");
        if (this._menuVisible) {
            u(this, false)
        }
        if (!this.args.cont) {
            this.hide()
        }
        this.callHooks("onBlur", this)
    }

    function e() {
        this._bluringTimeout = setTimeout(v(z, this), 50)
    }

    function N(D) {
        switch (D) {
            case"time-hour+":
                this.setHours(this.getHours() + 1);
                break;
            case"time-hour-":
                this.setHours(this.getHours() - 1);
                break;
            case"time-min+":
                this.setMinutes(this.getMinutes() + this.args.minuteStep);
                break;
            case"time-min-":
                this.setMinutes(this.getMinutes() - this.args.minuteStep);
                break;
            default:
                return
        }
    }

    var U = {"-3":"backYear", "-2":"back", "0":"now", "2":"fwd", "3":"fwdYear"};

    function aa(P, at, D) {
        if (this._bodyAnim) {
            this._bodyAnim.stop()
        }
        var ar;
        if (at != 0) {
            ar = new Date(P.date);
            ar.setDate(1);
            switch (at) {
                case"-Y":
                case -2:
                    ar.setFullYear(ar.getFullYear() - 1);
                    break;
                case"+Y":
                case 2:
                    ar.setFullYear(ar.getFullYear() + 1);
                    break;
                case"-M":
                case -1:
                    ar.setMonth(ar.getMonth() - 1);
                    break;
                case"+M":
                case 1:
                    ar.setMonth(ar.getMonth() + 1);
                    break
            }
        } else {
            ar = new Date()
        }
        return P.moveTo(ar, !D)
    }

    function u(ar, P) {
        ar._menuVisible = P;
        ae(P, ar.els.title, "DynarchCalendar-pressed-title");
        var at = ar.els.menu;
        if (c) {
            at.style.height = ar.els.main.offsetHeight + "px"
        }
        if (!ar.args.animation) {
            O(at, P);
            if (ar.focused) {
                ar.focus()
            }
        } else {
            if (ar._menuAnim) {
                ar._menuAnim.stop()
            }
            var D = ar.els.main.offsetHeight;
            if (c) {
                at.style.width = ar.els.topBar.offsetWidth + "px"
            }
            if (P) {
                at.firstChild.style.marginTop = -D + "px";
                ar.args.opacity > 0 && am(at, 0);
                O(at, true)
            }
            ar._menuAnim = ap({onUpdate:function (au, av) {
                at.firstChild.style.marginTop = av(Z.accel_b(au), -D, 0, !P) + "px";
                ar.args.opacity > 0 && am(at, av(Z.accel_b(au), 0, 0.85, !P))
            }, onStop:function () {
                ar.args.opacity > 0 && am(at, 0.85);
                at.firstChild.style.marginTop = "";
                ar._menuAnim = null;
                if (!P) {
                    O(at, false);
                    if (ar.focused) {
                        ar.focus()
                    }
                }
            }})
        }
    }

    function I(az, ay) {
        ay = ay || window.event;
        var au = o(ay);
        if (au && !au.getAttribute("disabled")) {
            var D = au.getAttribute("dyc-btn"), ax = au.getAttribute("dyc-type"), av = au.getAttribute("dyc-date"), at = this.selection, ar, P = {mouseover:an, mousemove:an, mouseup:function (aC) {
                var aB = au.getAttribute("dyc-cls");
                if (aB) {
                    aj(au, ao(aB, 1))
                }
                clearTimeout(ar);
                d(document, P, true);
                P = null
            }};
            if (az) {
                setTimeout(v(this.focus, this), 1);
                var aA = au.getAttribute("dyc-cls");
                if (aA) {
                    M(au, ao(aA, 1))
                }
                if ("menu" == D) {
                    this.toggleMenu()
                } else {
                    if (au && /^[+-][MY]$/.test(D)) {
                        if (aa(this, D)) {
                            var aw = v(function () {
                                if (aa(this, D, true)) {
                                    ar = setTimeout(aw, 40)
                                } else {
                                    P.mouseup();
                                    aa(this, D)
                                }
                            }, this);
                            ar = setTimeout(aw, 350);
                            p(document, P, true)
                        } else {
                            P.mouseup()
                        }
                    } else {
                        if ("year" == D) {
                            this.els.yearInput.focus();
                            this.els.yearInput.select()
                        } else {
                            if (ax == "time-am") {
                                p(document, P, true)
                            } else {
                                if (/^time/.test(ax)) {
                                    var aw = v(function (aB) {
                                        N.call(this, aB);
                                        ar = setTimeout(aw, 100)
                                    }, this, ax);
                                    N.call(this, ax);
                                    ar = setTimeout(aw, 350);
                                    p(document, P, true)
                                } else {
                                    if (av && at.type) {
                                        if (at.type == y.SEL_MULTIPLE) {
                                            if (ay.shiftKey && this._selRangeStart) {
                                                at.selectRange(this._selRangeStart, av)
                                            } else {
                                                if (!ay.ctrlKey && !at.isSelected(av)) {
                                                    at.clear(true)
                                                }
                                                at.set(av, true);
                                                this._selRangeStart = av
                                            }
                                        } else {
                                            at.set(av);
                                            this.moveTo(B(av), 2)
                                        }
                                        au = this._getDateDiv(av);
                                        T.call(this, true, {target:au})
                                    }
                                    p(document, P, true)
                                }
                            }
                        }
                    }
                }
                if (j && P && /dbl/i.test(ay.type)) {
                    P.mouseup()
                }
                if (/^(DynarchCalendar-(topBar|bottomBar|weekend|weekNumber|menu(-sep)?))?$/.test(au.className) && !this.args.cont) {
                    P.mousemove = v(g, this);
                    this._mouseDiff = f(ay, J(this.els.topCont));
                    p(document, P, true)
                }
            } else {
                if ("today" == D) {
                    if (!this._menuVisible && at.type == y.SEL_SINGLE) {
                        at.set(new Date())
                    }
                    this.moveTo(new Date(), true);
                    u(this, false)
                } else {
                    if (/^m([0-9]+)/.test(D)) {
                        var av = new Date(this.date);
                        av.setDate(1);
                        av.setMonth(RegExp.$1);
                        av.setFullYear(this._getInputYear());
                        this.moveTo(av, true);
                        u(this, false)
                    } else {
                        if (ax == "time-am") {
                            this.setHours(this.getHours() + 12)
                        }
                    }
                }
            }
            if (!j) {
                an(ay)
            }
        }
    }

    function g(P) {
        P = P || window.event;
        var D = this.els.topCont.style, ar = f(P, this._mouseDiff);
        D.left = ar.x + "px";
        D.top = ar.y + "px"
    }

    function o(P) {
        var D = P.target || P.srcElement, ar = D;
        while (D && D.getAttribute && !D.getAttribute("dyc-type")) {
            D = D.parentNode
        }
        return D.getAttribute && D || ar
    }

    function ao(D, P) {
        return"DynarchCalendar-" + D.split(/,/)[P]
    }

    function T(au, at) {
        at = at || window.event;
        var ar = o(at);
        if (ar) {
            var P = ar.getAttribute("dyc-type");
            if (P && !ar.getAttribute("disabled")) {
                if (!au || !this._bodyAnim || P != "date") {
                    var D = ar.getAttribute("dyc-cls");
                    D = D ? ao(D, 0) : "DynarchCalendar-hover-" + P;
                    if (P != "date" || this.selection.type) {
                        ae(au, ar, D)
                    }
                    if (P == "date") {
                        ae(au, ar.parentNode.parentNode, "DynarchCalendar-hover-week");
                        this._showTooltip(ar.getAttribute("dyc-date"))
                    }
                    if (/^time-hour/.test(P)) {
                        ae(au, this.els.timeHour, "DynarchCalendar-hover-time")
                    }
                    if (/^time-min/.test(P)) {
                        ae(au, this.els.timeMinute, "DynarchCalendar-hover-time")
                    }
                    aj(this._getDateDiv(this._lastHoverDate), "DynarchCalendar-hover-date");
                    this._lastHoverDate = null
                }
            }
        }
        if (!au) {
            this._showTooltip()
        }
    }

    function E(ar) {
        ar = ar || window.event;
        var P = o(ar);
        if (P) {
            var at = P.getAttribute("dyc-btn"), D = P.getAttribute("dyc-type"), au = ar.wheelDelta ? ar.wheelDelta / 120 : -ar.detail / 3;
            au = au < 0 ? -1 : au > 0 ? 1 : 0;
            if (this.args.reverseWheel) {
                au = -au
            }
            if (/^(time-(hour|min))/.test(D)) {
                switch (RegExp.$1) {
                    case"time-hour":
                        this.setHours(this.getHours() + au);
                        break;
                    case"time-min":
                        this.setMinutes(this.getMinutes() + this.args.minuteStep * au);
                        break
                }
                an(ar)
            } else {
                if (/Y/i.test(at)) {
                    au *= 2
                }
                aa(this, -au);
                an(ar)
            }
        }
    }

    function R() {
        this.refresh();
        var D = this.inputField, P = this.selection;
        if (D) {
            var ar = P.print(this.dateFormat);
            (/input|textarea/i.test(D.tagName)) ? D.value = ar : D.innerHTML = ar
        }
        this.callHooks("onSelect", this, P)
    }

    var ag = {37:-1, 38:-2, 39:1, 40:2}, Q = {33:-1, 34:1};

    function L(aB) {
        if (this._menuAnim) {
            return
        }
        aB = aB || window.event;
        var ar = aB.target || aB.srcElement, aC = ar.getAttribute("dyc-btn"), aD = aB.keyCode, ay = aB.charCode || aD, D = ag[aD];
        if ("year" == aC && aD == 13) {
            var au = new Date(this.date);
            au.setDate(1);
            au.setFullYear(this._getInputYear());
            this.moveTo(au, true);
            u(this, false);
            return an(aB)
        }
        if (this._menuVisible) {
            if (aD == 27) {
                u(this, false);
                return an(aB)
            }
        } else {
            if (!aB.ctrlKey) {
                D = null
            }
            if (D == null && !aB.ctrlKey) {
                D = Q[aD]
            }
            if (aD == 36) {
                D = 0
            }
            if (D != null) {
                aa(this, D);
                return an(aB)
            }
            ay = String.fromCharCode(ay).toLowerCase();
            var ax = this.els.yearInput, P = this.selection;
            if (ay == " ") {
                u(this, true);
                this.focus();
                ax.focus();
                ax.select();
                return an(aB)
            }
            if (ay >= "0" && ay <= "9") {
                u(this, true);
                this.focus();
                ax.value = ay;
                ax.focus();
                return an(aB)
            }
            var av = aq("mn"), az = aB.shiftKey ? -1 : this.date.getMonth(), aw = 0, at;
            while (++aw < 12) {
                at = av[(az + aw) % 12].toLowerCase();
                if (at.indexOf(ay) == 0) {
                    var au = new Date(this.date);
                    au.setDate(1);
                    au.setMonth((az + aw) % 12);
                    this.moveTo(au, true);
                    return an(aB)
                }
            }
            if (aD >= 37 && aD <= 40) {
                var au = this._lastHoverDate;
                if (!au && !P.isEmpty()) {
                    au = aD < 39 ? P.getFirstDate() : P.getLastDate();
                    if (au < this._firstDateVisible || au > this._lastDateVisible) {
                        au = null
                    }
                }
                if (!au) {
                    au = aD < 39 ? this._lastDateVisible : this._firstDateVisible
                } else {
                    var aA = au;
                    au = B(au);
                    var az = 100;
                    while (az-- > 0) {
                        switch (aD) {
                            case 37:
                                au.setDate(au.getDate() - 1);
                                break;
                            case 38:
                                au.setDate(au.getDate() - 7);
                                break;
                            case 39:
                                au.setDate(au.getDate() + 1);
                                break;
                            case 40:
                                au.setDate(au.getDate() + 7);
                                break
                        }
                        if (!this.isDisabled(au)) {
                            break
                        }
                    }
                    au = V(au);
                    if (au < this._firstDateVisible || au > this._lastDateVisible) {
                        this.moveTo(au)
                    }
                }
                aj(this._getDateDiv(aA), M(this._getDateDiv(au), "DynarchCalendar-hover-date"));
                this._lastHoverDate = au;
                return an(aB)
            }
            if (aD == 13) {
                if (this._lastHoverDate) {
                    if (P.type == y.SEL_MULTIPLE && (aB.shiftKey || aB.ctrlKey)) {
                        if (aB.shiftKey && this._selRangeStart) {
                            P.clear(true);
                            P.selectRange(this._selRangeStart, this._lastHoverDate)
                        }
                        if (aB.ctrlKey) {
                            P.set(this._selRangeStart = this._lastHoverDate, true)
                        }
                    } else {
                        P.reset(this._selRangeStart = this._lastHoverDate)
                    }
                    return an(aB)
                }
            }
            if (aD == 27 && !this.args.cont) {
                this.hide()
            }
        }
    }

    l._getDateDiv = function (D) {
        var ar = null;
        if (D) {
            try {
                t(this.els.body, function (at) {
                    if (at.getAttribute("dyc-date") == D) {
                        throw ar = at
                    }
                })
            } catch (P) {
            }
        }
        return ar
    };
    function k(D, P) {
        return D.replace(/\$\{([^:\}]+)(:[^\}]+)?\}/g, function (av, au, at) {
            var aw = P[au], ar;
            if (at) {
                ar = at.substr(1).split(/\s*\|\s*/);
                aw = (aw >= ar.length ? ar[ar.length - 1] : ar[aw]).replace(/##?/g, function (ax) {
                    return ax.length == 2 ? "#" : aw
                })
            }
            return aw
        })
    }

    function aq(ar, P) {
        var D = q.__.data[ar];
        if (P && typeof D == "string") {
            D = k(D, P)
        }
        return D
    }

    (y.Selection = function (ar, P, D, at) {
        this.type = P;
        this.sel = ar instanceof Array ? ar : [ar];
        this.onChange = v(D, at);
        this.cal = at
    }).prototype = {get:function () {
        return this.type == y.SEL_SINGLE ? this.sel[0] : this.sel
    }, isEmpty:function () {
        return this.sel.length == 0
    }, set:function (P, D, ar) {
        var at = this.type == y.SEL_SINGLE;
        if (P instanceof Array) {
            this.sel = P;
            this.normalize();
            if (!ar) {
                this.onChange(this)
            }
        } else {
            P = V(P);
            if (at || !this.isSelected(P)) {
                at ? this.sel = [P] : this.sel.splice(this.findInsertPos(P), 0, P);
                this.normalize();
                if (!ar) {
                    this.onChange(this)
                }
            } else {
                if (D) {
                    this.unselect(P, ar)
                }
            }
        }
    }, reset:function () {
        this.sel = [];
        this.set.apply(this, arguments)
    }, countDays:function () {
        var av = 0, D = this.sel, P = D.length, at, au, ar;
        while (--P >= 0) {
            at = D[P];
            if (at instanceof Array) {
                au = B(at[0]);
                ar = B(at[1]);
                av += Math.round(Math.abs(ar.getTime() - au.getTime()) / 86400000)
            }
            ++av
        }
        return av
    }, unselect:function (P, ar) {
        P = V(P);
        var at = false;
        for (var ay = this.sel, au = ay.length, D; --au >= 0;) {
            D = ay[au];
            if (D instanceof Array) {
                if (P >= D[0] && P <= D[1]) {
                    var av = B(P), ax = av.getDate();
                    if (P == D[0]) {
                        av.setDate(ax + 1);
                        D[0] = V(av);
                        at = true
                    } else {
                        if (P == D[1]) {
                            av.setDate(ax - 1);
                            D[1] = V(av);
                            at = true
                        } else {
                            var aw = new Date(av);
                            aw.setDate(ax + 1);
                            av.setDate(ax - 1);
                            ay.splice(au + 1, 0, [V(aw), D[1]]);
                            D[1] = V(av);
                            at = true
                        }
                    }
                }
            } else {
                if (P == D) {
                    ay.splice(au, 1);
                    at = true
                }
            }
        }
        if (at) {
            this.normalize();
            if (!ar) {
                this.onChange(this)
            }
        }
    }, normalize:function () {
        this.sel = this.sel.sort(function (ay, ax) {
            if (ay instanceof Array) {
                ay = ay[0]
            }
            if (ax instanceof Array) {
                ax = ax[0]
            }
            return ay - ax
        });
        for (var P = this.sel, ar = P.length, av, au; --ar >= 0;) {
            av = P[ar];
            if (av instanceof Array) {
                if (av[0] > av[1]) {
                    P.splice(ar, 1);
                    continue
                }
                if (av[0] == av[1]) {
                    av = P[ar] = av[0]
                }
            }
            if (au) {
                var at = au, aw = av instanceof Array ? av[1] : av;
                aw = B(aw);
                aw.setDate(aw.getDate() + 1);
                aw = V(aw);
                if (aw >= at) {
                    var D = P[ar + 1];
                    if (av instanceof Array && D instanceof Array) {
                        av[1] = D[1];
                        P.splice(ar + 1, 1)
                    } else {
                        if (av instanceof Array) {
                            av[1] = au;
                            P.splice(ar + 1, 1)
                        } else {
                            if (D instanceof Array) {
                                D[0] = av;
                                P.splice(ar, 1)
                            } else {
                                P[ar] = [av, D];
                                P.splice(ar + 1, 1)
                            }
                        }
                    }
                }
            }
            au = av instanceof Array ? av[0] : av
        }
    }, findInsertPos:function (P) {
        for (var D = this.sel, ar = D.length, at; --ar >= 0;) {
            at = D[ar];
            if (at instanceof Array) {
                at = at[0]
            }
            if (at <= P) {
                break
            }
        }
        return ar + 1
    }, clear:function (D) {
        this.sel = [];
        if (!D) {
            this.onChange(this)
        }
    }, selectRange:function (au, at) {
        au = V(au);
        at = V(at);
        if (au > at) {
            var ar = au;
            au = at;
            at = ar
        }
        var D = this.cal.args.checkRange;
        if (!D) {
            return this._do_selectRange(au, at)
        }
        try {
            m(new y.Selection([
                [au, at]
            ], y.SEL_MULTIPLE, ad).getDates(), v(function (av) {
                if (this.isDisabled(av)) {
                    if (D instanceof Function) {
                        D(av, this)
                    }
                    throw"OUT"
                }
            }, this.cal));
            this._do_selectRange(au, at)
        } catch (P) {
        }
    }, _do_selectRange:function (P, D) {
        this.sel.push([P, D]);
        this.normalize();
        this.onChange(this)
    }, isSelected:function (D) {
        for (var P = this.sel.length, ar; --P >= 0;) {
            ar = this.sel[P];
            if (ar instanceof Array && D >= ar[0] && D <= ar[1] || D == ar) {
                return true
            }
        }
        return false
    }, getFirstDate:function () {
        var D = this.sel[0];
        if (D && D instanceof Array) {
            D = D[0]
        }
        return D
    }, getLastDate:function () {
        if (this.sel.length > 0) {
            var D = this.sel[this.sel.length - 1];
            if (D && D instanceof Array) {
                D = D[1]
            }
            return D
        }
    }, print:function (ar, at) {
        var P = [], au = 0, aw, av = this.cal.getHours(), D = this.cal.getMinutes();
        if (!at) {
            at = " -> "
        }
        while (au < this.sel.length) {
            aw = this.sel[au++];
            if (aw instanceof Array) {
                P.push(ab(B(aw[0], av, D), ar) + at + ab(B(aw[1], av, D), ar))
            } else {
                P.push(ab(B(aw, av, D), ar))
            }
        }
        return P
    }, getDates:function (P) {
        var D = [], ar = 0, au, at;
        while (ar < this.sel.length) {
            at = this.sel[ar++];
            if (at instanceof Array) {
                au = B(at[0]);
                at = at[1];
                while (V(au) < at) {
                    D.push(P ? ab(au, P) : new Date(au));
                    au.setDate(au.getDate() + 1)
                }
            } else {
                au = B(at)
            }
            D.push(P ? ab(au, P) : au)
        }
        return D
    }};
    function a(P) {
        P = new Date(P.getFullYear(), P.getMonth(), P.getDate(), 12, 0, 0);
        var ar = P.getDay();
        P.setDate(P.getDate() - (ar + 6) % 7 + 3);
        var D = P.valueOf();
        P.setMonth(0);
        P.setDate(4);
        return Math.round((D - P.valueOf()) / (7 * 86400000)) + 1
    }

    function C(D) {
        D = new Date(D.getFullYear(), D.getMonth(), D.getDate(), 12, 0, 0);
        var ar = new Date(D.getFullYear(), 0, 1, 12, 0, 0);
        var P = D - ar;
        return Math.floor(P / 86400000)
    }

    function V(D) {
        if (D instanceof Date) {
            return 10000 * D.getFullYear() + 100 * (D.getMonth() + 1) + D.getDate()
        }
        if (typeof D == "string") {
            return parseInt(D, 10)
        }
        return D
    }

    function B(ar, au, av, at, P) {
        if (!(ar instanceof Date)) {
            ar = parseInt(ar, 10);
            var aw = Math.floor(ar / 10000);
            ar = ar % 10000;
            var D = Math.floor(ar / 100);
            ar = ar % 100;
            ar = new Date(aw, D - 1, ar, au || 12, av || 0, at || 0, P || 0)
        }
        return ar
    }

    function af(aw, au, ar) {
        var av = aw.getFullYear(), ay = aw.getMonth(), P = aw.getDate(), at = au.getFullYear(), ax = au.getMonth(), D = au.getDate();
        return av < at ? -3 : av > at ? 3 : ay < ax ? -2 : ay > ax ? 2 : ar ? 0 : P < D ? -1 : P > D ? 1 : 0
    }

    function ab(D, ax) {
        var P = D.getMonth(), aw = D.getDate(), ay = D.getFullYear(), az = a(D), aA = D.getDay(), aB = D.getHours(), ar = (aB >= 12), au = (ar) ? (aB - 12) : aB, aD = C(D), at = D.getMinutes(), av = D.getSeconds(), aC = /%./g, aE;
        if (au === 0) {
            au = 12
        }
        aE = {"%a":aq("sdn")[aA], "%A":aq("dn")[aA], "%b":aq("smn")[P], "%B":aq("mn")[P], "%C":1 + Math.floor(ay / 100), "%d":aw < 10 ? "0" + aw : aw, "%e":aw, "%H":aB < 10 ? "0" + aB : aB, "%I":au < 10 ? "0" + au : au, "%j":aD < 10 ? "00" + aD : aD < 100 ? "0" + aD : aD, "%k":aB, "%l":au, "%m":P < 9 ? "0" + (1 + P) : 1 + P, "%o":1 + P, "%M":at < 10 ? "0" + at : at, "%n":"\n", "%p":ar ? "PM" : "AM", "%P":ar ? "pm" : "am", "%s":Math.floor(D.getTime() / 1000), "%S":av < 10 ? "0" + av : av, "%t":"\t", "%U":az < 10 ? "0" + az : az, "%W":az < 10 ? "0" + az : az, "%V":az < 10 ? "0" + az : az, "%u":aA + 1, "%w":aA, "%y":("" + ay).substr(2, 2), "%Y":ay, "%%":"%"};
        return ax.replace(aC, function (aF) {
            return aE.hasOwnProperty(aF) ? aE[aF] : aF
        })
    }

    function Y(P) {
        if (P) {
            if (typeof P == "number") {
                return B(P)
            }
            if (!(P instanceof Date)) {
                var D = P.split(/-/);
                return new Date(parseInt(D[0], 10), parseInt(D[1], 10) - 1, parseInt(D[2], 10), 12, 0, 0, 0)
            }
        }
        return P
    }

    function A(ar) {
        if (/\S/.test(ar)) {
            ar = ar.toLowerCase();
            function P(at) {
                for (var au = at.length; --au >= 0;) {
                    if (at[au].toLowerCase().indexOf(ar) == 0) {
                        return au
                    }
                }
            }

            var D = P(aq("smn")) || P(aq("mn"));
            if (D != null) {
                D++
            }
            return D
        }
    }

    y.parseDate = function (au, D, aw) {
        if (!/\S/.test(au)) {
            return""
        }
        au = au.replace(/^\s+/, "").replace(/\s+$/, "");
        aw = aw || new Date();
        var aB = null, P = null, aD = null, av = null, ar = null, aC = null;
        var ay = au.match(/([0-9]{1,2}):([0-9]{1,2})(:[0-9]{1,2})?\s*(am|pm)?/i);
        if (ay) {
            av = parseInt(ay[1], 10);
            ar = parseInt(ay[2], 10);
            aC = ay[3] ? parseInt(ay[3].substr(1), 10) : 0;
            au = au.substring(0, ay.index) + au.substr(ay.index + ay[0].length);
            if (ay[4]) {
                if (ay[4].toLowerCase() == "pm" && av < 12) {
                    av += 12
                } else {
                    if (ay[4].toLowerCase() == "am" && av >= 12) {
                        av -= 12
                    }
                }
            }
        }
        var az = au.split(/\W+/);
        var ax = [];
        for (var at = 0; at < az.length; ++at) {
            var aA = az[at];
            if (/^[0-9]{4}$/.test(aA)) {
                aB = parseInt(aA, 10);
                if (!P && !aD && D == null) {
                    D = true
                }
            } else {
                if (/^[0-9]{1,2}$/.test(aA)) {
                    aA = parseInt(aA, 10);
                    if (aA >= 60) {
                        aB = aA
                    } else {
                        if (aA >= 0 && aA <= 12) {
                            ax.push(aA)
                        } else {
                            if (aA >= 1 && aA <= 31) {
                                aD = aA
                            }
                        }
                    }
                } else {
                    P = A(aA)
                }
            }
        }
        if (ax.length >= 2) {
            if (D) {
                if (!P) {
                    P = ax.shift()
                }
                if (!aD) {
                    aD = ax.shift()
                }
            } else {
                if (!aD) {
                    aD = ax.shift()
                }
                if (!P) {
                    P = ax.shift()
                }
            }
        } else {
            if (ax.length == 1) {
                if (!aD) {
                    aD = ax.shift()
                } else {
                    if (!P) {
                        P = ax.shift()
                    }
                }
            }
        }
        if (!aB) {
            aB = ax.length > 0 ? ax.shift() : aw.getFullYear()
        }
        if (aB < 30) {
            aB += 2000
        } else {
            if (aB < 99) {
                aB += 1900
            }
        }
        if (!P) {
            P = aw.getMonth() + 1
        }
        return aB && P && aD ? new Date(aB, P - 1, aD, av, ar, aC) : null
    };
    function al(D, at, P, ar) {
        ar = {};
        for (P in at) {
            if (at.hasOwnProperty(P)) {
                ar[P] = at[P]
            }
        }
        for (P in D) {
            if (D.hasOwnProperty(P)) {
                ar[P] = D[P]
            }
        }
        return ar
    }

    function p(ar, au, at, D) {
        if (ar instanceof Array) {
            for (var P = ar.length; --P >= 0;) {
                p(ar[P], au, at, D)
            }
        } else {
            if (typeof au == "object") {
                for (var P in au) {
                    if (au.hasOwnProperty(P)) {
                        p(ar, P, au[P], at)
                    }
                }
            } else {
                if (ar.addEventListener) {
                    ar.addEventListener(au, at, j ? true : !!D)
                } else {
                    if (ar.attachEvent) {
                        ar.attachEvent("on" + au, at)
                    } else {
                        ar["on" + au] = at
                    }
                }
            }
        }
    }

    function d(ar, au, at, D) {
        if (ar instanceof Array) {
            for (var P = ar.length; --P >= 0;) {
                d(ar[P], au, at)
            }
        } else {
            if (typeof au == "object") {
                for (var P in au) {
                    if (au.hasOwnProperty(P)) {
                        d(ar, P, au[P], at)
                    }
                }
            } else {
                if (ar.removeEventListener) {
                    ar.removeEventListener(au, at, j ? true : !!D)
                } else {
                    if (ar.detachEvent) {
                        ar.detachEvent("on" + au, at)
                    } else {
                        ar["on" + au] = null
                    }
                }
            }
        }
    }

    function an(D) {
        D = D || window.event;
        if (j) {
            D.cancelBubble = true;
            D.returnValue = false
        } else {
            D.preventDefault();
            D.stopPropagation()
        }
        return false
    }

    function aj(au, at, av) {
        if (au) {
            var D = au.className.replace(/^\s+|\s+$/, "").split(/\x20/), P = [], ar;
            for (ar = D.length; ar > 0;) {
                if (D[--ar] != at) {
                    P.push(D[ar])
                }
            }
            if (av) {
                P.push(av)
            }
            au.className = P.join(" ")
        }
        return av
    }

    function M(P, D) {
        return aj(P, D, D)
    }

    function ae(at, ar, P) {
        if (ar instanceof Array) {
            for (var D = ar.length; --D >= 0;) {
                ae(at, ar[D], P)
            }
        } else {
            aj(ar, P, at ? P : null)
        }
        return at
    }

    function G(at, D, ar) {
        var P = null;
        if (document.createElementNS) {
            P = document.createElementNS("http://www.w3.org/1999/xhtml", at)
        } else {
            P = document.createElement(at)
        }
        if (D) {
            P.className = D
        }
        if (ar) {
            ar.appendChild(P)
        }
        return P
    }

    function b(au, av) {
        if (av == null) {
            av = 0
        }
        var D, at, P;
        try {
            D = Array.prototype.slice.call(au, av)
        } catch (ar) {
            D = new Array(au.length - av);
            for (at = av, P = 0; at < au.length; ++at, ++P) {
                D[P] = au[at]
            }
        }
        return D
    }

    function v(P, ar) {
        var D = b(arguments, 2);
        return(ar == undefined ? function () {
            return P.apply(this, D.concat(b(arguments)))
        } : function () {
            return P.apply(ar, D.concat(b(arguments)))
        })
    }

    function t(P, ar) {
        if (!ar(P)) {
            for (var D = P.firstChild; D; D = D.nextSibling) {
                if (D.nodeType == 1) {
                    t(D, ar)
                }
            }
        }
    }

    function ap(D, aw, ar) {
        D = al(D, {fps:50, len:15, onUpdate:ad, onStop:ad});
        if (j) {
            D.len = Math.round(D.len / 2)
        }
        function at(aA, az, ax, ay) {
            return ay ? ax + aA * (az - ax) : az + aA * (ax - az)
        }

        function av() {
            if (aw) {
                P()
            }
            ar = 0;
            aw = setInterval(au, 1000 / D.fps)
        }

        function P() {
            if (aw) {
                clearInterval(aw);
                aw = null
            }
            D.onStop(ar / D.len, at)
        }

        function au() {
            var ax = D.len;
            D.onUpdate(ar / ax, at);
            if (ar == ax) {
                P()
            }
            ++ar
        }

        av();
        return{start:av, stop:P, update:au, args:D, map:at}
    }

    var Z = {elastic_b:function (D) {
        return 1 - Math.cos(-D * 5.5 * Math.PI) / Math.pow(2, 7 * D)
    }, magnetic:function (D) {
        return 1 - Math.cos(D * D * D * 10.5 * Math.PI) / Math.exp(4 * D)
    }, accel_b:function (D) {
        D = 1 - D;
        return 1 - D * D * D * D
    }, accel_a:function (D) {
        return D * D * D
    }, accel_ab:function (D) {
        D = 1 - D;
        return 1 - Math.sin(D * D * Math.PI / 2)
    }, accel_ab2:function (D) {
        return(D /= 0.5) < 1 ? 1 / 2 * D * D : -1 / 2 * ((--D) * (D - 2) - 1)
    }, brakes:function (D) {
        D = 1 - D;
        return 1 - Math.sin(D * D * Math.PI)
    }, shake:function (D) {
        return D < 0.5 ? -Math.cos(D * 11 * Math.PI) * D * D : (D = 1 - D, Math.cos(D * 11 * Math.PI) * D * D)
    }};

    function am(D, P) {
        if (P === "") {
            j ? D.style.filter = "" : D.style.opacity = ""
        } else {
            if (P != null) {
                j ? D.style.filter = "alpha(opacity=" + P * 100 + ")" : D.style.opacity = P
            } else {
                if (!j) {
                    P = parseFloat(D.style.opacity)
                } else {
                    if (/alpha\(opacity=([0-9.])+\)/.test(D.style.opacity)) {
                        P = parseFloat(RegExp.$1) / 100
                    }
                }
            }
        }
        return P
    }

    function O(ar, D) {
        var P = ar.style;
        if (D != null) {
            P.display = D ? "" : "none"
        }
        return P.display != "none"
    }

    function f(P, ar) {
        var D = j ? P.clientX + document.body.scrollLeft : P.pageX;
        var at = j ? P.clientY + document.body.scrollTop : P.pageY;
        if (ar) {
            D -= ar.x;
            at -= ar.y
        }
        return{x:D, y:at}
    }

    function J(au) {
        var D = 0, at = 0, ar = /^div$/i.test(au.tagName), av, P;
        if (ar && au.scrollLeft) {
            D = au.scrollLeft
        }
        if (ar && au.scrollTop) {
            at = au.scrollTop
        }
        av = {x:au.offsetLeft - D, y:au.offsetTop - at};
        if (au.offsetParent) {
            P = J(au.offsetParent);
            av.x += P.x;
            av.y += P.y
        }
        return av
    }

    function X() {
        var P = document.documentElement, D = document.body;
        return{x:P.scrollLeft || D.scrollLeft, y:P.scrollTop || D.scrollTop, w:P.clientWidth || window.innerWidth || D.clientWidth, h:P.clientHeight || window.innerHeight || D.clientHeight}
    }

    function m(D, ar, P) {
        for (P = 0; P < D.length; ++P) {
            ar(D[P])
        }
    }

    var ad = new Function();

    function W(D) {
        if (typeof D == "string") {
            D = document.getElementById(D)
        }
        return D
    }

    return y
})();

Calendar.LANG("en", "English", {

    fdow: 1,                // first day of week for this locale; 0 = Sunday, 1 = Monday, etc.

    goToday: "Go Today",

    today: "Today",         // appears in bottom bar

    wk: "wk",

    weekend: "0,6",         // 0 = Sunday, 1 = Monday, etc.

    AM: "am",

    PM: "pm",

    mn : [ "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December" ],

    smn : [ "Jan",
        "Feb",
        "Mar",
        "Apr",
        "May",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Oct",
        "Nov",
        "Dec" ],

    dn : [ "Sunday",
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
        "Sunday" ],

    sdn : [ "Su",
        "Mo",
        "Tu",
        "We",
        "Th",
        "Fr",
        "Sa",
        "Su" ]

});
